/*
 * ReasignacionDAO.java
 *
 * Created on 13 de junio de 2007, 11:17 AM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.src.computec.radar.distribucion.reasignacion.dao;

import com.src.computec.radar.base.dao.GenericDAO;
import com.src.computec.radar.base.dao.exception.DAOException;
import com.src.computec.radar.distribucion.base.constantes.ConstantesGenerales;
import com.src.computec.radar.distribucion.source.DistribucionSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import static com.src.computec.radar.distribucion.base.constantes.ConstantesGenerales.SCHEMA;
import com.src.computec.radar.distribucion.reasignacion.dto.DetailDto;
import com.src.computec.radar.distribucion.reasignacion.dto.ReasignacionDistribucionDto;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Hashtable;

/**
 *
 * @author aocampo
 */
public class ReasignacionDAO extends GenericDAO implements BaseReasignacionDAO {
    
    /** Creates a new instance of ReasignacionDAO */
    public ReasignacionDAO() {
    }   
    
    public Hashtable getReasignacionesDistribucion(ReasignacionDistribucionDto dto) throws DAOException {
        Hashtable hashtable = new Hashtable();
        List listReasignacionesDistribucion = new ArrayList();
        List listDetail = new ArrayList();
        List listCodigosBarra = dto.getListCodigosBarra();
        Connection con = null;
        PreparedStatement statement1 = null;
        PreparedStatement statement2 = null;
        ResultSet rs1 = null;
        ResultSet rs2 = null;
        String razonSocialProveedorFinal = "";
        String nombreNodoFinal = "";
        String baseQuery = "SELECT E.CODIGO_BARRAS, E.NUMERO_ORDEN, E.FECHA_PROCESO, E.CODIGO_CLIENTE, E.CODIGO_PRODUCTO, E.CODIGO_NODO, E.DIRECCION_DESTINATARIO, " +
                           "D.NOMBRE_DEPARTAMENTO, CP.NOMBRE_CENTRO_POBLADO, P.RAZON_SOCIAL, ND.NOMBRE_NODO " +
                           "FROM " + SCHEMA + ".ENVIO E " +
                           "INNER JOIN " + SCHEMA + ".DEPARTAMENTO D ON E.CODIGO_DEPARTAMENTO = D.CODIGO_DEPARTAMENTO " +
                           "INNER JOIN " + SCHEMA + ".CENTRO_POBLADO CP ON E.CODIGO_DEPARTAMENTO = CP.CODIGO_DEPARTAMENTO AND E.CODIGO_MUNICIPIO = CP.CODIGO_MUNICIPIO AND E.CODIGO_CENTROP = CP.CODIGO_CENTROP " +
                           "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON E.CODIGO_NODO = ND.CODIGO_NODO " +
                           "INNER JOIN " + SCHEMA + ".PROVEEDOR P ON ND.CODIGO_PROVEEDOR = P.CODIGO_PROVEEDOR ";
        String baseWhere = "WHERE E.CODIGO_BARRAS IN (";
        String baseOrderBy = "ORDER BY E.CODIGO_BARRAS";
        for (int i=0; i<listCodigosBarra.size(); i++) {
            if (i != 0) {
                baseWhere += ", ?";
            }
            else {
                baseWhere += "?";
            }
        }
        baseWhere += ") ";
        try {
            con = getConnectionDB2();
            statement1 = con.prepareStatement("SELECT P.RAZON_SOCIAL, ND.NOMBRE_NODO " +
                                              "FROM " + SCHEMA + ".NODO_DISTRIBUCION ND " +
                                              "INNER JOIN " + SCHEMA + ".PROVEEDOR P ON ND.CODIGO_PROVEEDOR = P.CODIGO_PROVEEDOR " +
                                              "WHERE ND.CODIGO_NODO = ?");
            statement2 = con.prepareStatement(baseQuery + baseWhere + baseOrderBy);
            int indice = 0;
            statement1.setObject(++indice, dto.getCodigoNodoFinal());
            rs1 = statement1.executeQuery();
            if (rs1.next()) {
                indice = 0;
                razonSocialProveedorFinal = rs1.getString(++indice);
                nombreNodoFinal = rs1.getString(++indice);
            }
            indice = 0;
            Iterator iterator = listCodigosBarra.iterator();
            while (iterator.hasNext()) {
                statement2.setObject(++indice, (String) iterator.next());
            }
            rs2 = statement2.executeQuery();
            while (rs2.next()) {
                indice = 0;
                String codigoBarras = rs2.getString(++indice);
                ReasignacionDistribucionDto reasignacionDistribucionDto = new ReasignacionDistribucionDto();
                reasignacionDistribucionDto.setUidResponsable(dto.getUidResponsable());
                reasignacionDistribucionDto.setFechaReasignacion(dto.getFechaReasignacion());
                reasignacionDistribucionDto.setNumeroOrden(rs2.getString(++indice));
                reasignacionDistribucionDto.setFechaProceso(rs2.getDate(++indice));
                reasignacionDistribucionDto.setCodigoCliente(rs2.getString(++indice));
                reasignacionDistribucionDto.setCodigoProducto(rs2.getString(++indice));
                reasignacionDistribucionDto.setCodigoNodoInicial(rs2.getString(++indice));
                reasignacionDistribucionDto.setCodigoNodoFinal(dto.getCodigoNodoFinal());
                reasignacionDistribucionDto.setDescripcionMotivo(dto.getDescripcionMotivo());
                DetailDto detailDto = new DetailDto();
                detailDto.setCodigoBarras(codigoBarras);
                detailDto.setDireccionDestinatario(rs2.getString(++indice));
                detailDto.setNombreDepartamento(rs2.getString(++indice));
                detailDto.setNombreCentroPoblado(rs2.getString(++indice));
                detailDto.setRazonSocialProveedorInicial(rs2.getString(++indice));
                detailDto.setNombreNodoInicial(rs2.getString(++indice));
                detailDto.setRazonSocialProveedorFinal(razonSocialProveedorFinal);
                detailDto.setNombreNodoFinal(nombreNodoFinal);
                listDetail.add(detailDto);
                reasignacionDistribucionDto.setListCodigosBarra(new ArrayList());
                reasignacionDistribucionDto.getListCodigosBarra().add(detailDto);
                if (listReasignacionesDistribucion.contains(reasignacionDistribucionDto)) {
                    int indexOfDto = listReasignacionesDistribucion.indexOf(reasignacionDistribucionDto);
                    ReasignacionDistribucionDto reasignacionDistribucionDtoAux = (ReasignacionDistribucionDto) listReasignacionesDistribucion.get(indexOfDto);
                    reasignacionDistribucionDtoAux.getListCodigosBarra().add(detailDto);
                }
                else {
                    listReasignacionesDistribucion.add(reasignacionDistribucionDto);
                }
            }
            hashtable.put("listReasignacionesDistribucion", listReasignacionesDistribucion);
            hashtable.put("listDetail", listDetail);
        } 
        catch (SQLException e) {
            throw new DAOException("ReasignacionDAO:getReasignacionesDistribucion: " + e.toString(), e);
        }
        finally {
            closeConnection(null, statement1, rs1);
            closeConnection(con, statement2, rs2);
        }
        return hashtable;
    }
    
    public void insertReasignacionesDistribucion(List listReasignacionesDistribucion) throws DAOException {
        Connection con = null;
        PreparedStatement statement1 = null;
        PreparedStatement statement2 = null;
        try {
            con = getConnectionDB2();
            con.setAutoCommit(false);
            statement1 = con.prepareStatement("INSERT INTO " + SCHEMA + ".REASIGNACION_DISTRIBUCION (CODIGO_REASIGNACION, UID_RESPONSABLE, FECHA_REASIGNACION, NUMERO_ORDEN, FECHA_PROCESO, CODIGO_CLIENTE, CODIGO_PRODUCTO, CODIGO_NODO_INICIAL, CODIGO_NODO_FINAL, DESCRIPCION_MOTIVO, BASE_GENERADA) " +
                                              "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
            statement2 = con.prepareStatement("INSERT INTO " + SCHEMA + ".REASIGNACION_DISTRIBUCION_DETALLE (CODIGO_REASIGNACION, CODIGO_BARRAS) " +
                                              "VALUES (?, ?)");
            Iterator iterator1 = listReasignacionesDistribucion.iterator();
            while (iterator1.hasNext()) {
                int indice = 0;
                ReasignacionDistribucionDto reasignacionDistribucionDto = (ReasignacionDistribucionDto) iterator1.next();
                reasignacionDistribucionDto.setCodigoReasignacion(this.getNextId(con, SCHEMA + ".REASIGNACION_DISTRIBUCION", "CODIGO_REASIGNACION"));
                statement1.setObject(++indice, reasignacionDistribucionDto.getCodigoReasignacion());
                statement1.setObject(++indice, reasignacionDistribucionDto.getUidResponsable());
                statement1.setObject(++indice, new Timestamp(reasignacionDistribucionDto.getFechaReasignacion().getTime()));
                statement1.setObject(++indice, reasignacionDistribucionDto.getNumeroOrden());
                statement1.setObject(++indice, new Timestamp(reasignacionDistribucionDto.getFechaProceso().getTime()));
                statement1.setObject(++indice, reasignacionDistribucionDto.getCodigoCliente());
                statement1.setObject(++indice, reasignacionDistribucionDto.getCodigoProducto());
                statement1.setObject(++indice, reasignacionDistribucionDto.getCodigoNodoInicial());
                statement1.setObject(++indice, reasignacionDistribucionDto.getCodigoNodoFinal());
                statement1.setObject(++indice, reasignacionDistribucionDto.getDescripcionMotivo());
                statement1.setObject(++indice, 0);
                statement1.executeUpdate();
                Iterator iterator2 = reasignacionDistribucionDto.getListCodigosBarra().iterator();
                while (iterator2.hasNext()) {
                    int indice1 = 0;
                    DetailDto detailDto = (DetailDto) iterator2.next();
                    statement2.setObject(++indice1, reasignacionDistribucionDto.getCodigoReasignacion());
                    statement2.setObject(++indice1, detailDto.getCodigoBarras());
                    statement2.executeUpdate();
                }
            }
            con.commit();
        } 
        catch (SQLException e) {
            try {
                con.rollback();
                throw new DAOException("ReasignacionDAO:insertReasignacionesDistribucion: " + e.toString(), e);
            }
            catch (SQLException ex) {
                throw new DAOException("ReasignacionDAO:insertReasignacionesDistribucion:rollback: " + ex.toString(), ex);
            }
        }
        catch (Exception e) {
            try {
                con.rollback();
                throw new DAOException("ReasignacionDAO:insertReasignacionesDistribucion: " + e.toString(), e);
            }
            catch (SQLException ex) {
                throw new DAOException("ReasignacionDAO:insertReasignacionesDistribucion:rollback: " + ex.toString(), ex);
            }
        }
        finally {
            closeConnection(null, statement1);
            closeConnection(con, statement2);
        }
    }
    
    public Hashtable updateEnvios(List listReasignacionesDistribucion, String uidEvaluacion) throws DAOException {
        Hashtable hashtable = new Hashtable();
        List listReasignacionesDistribucionAll = new ArrayList();
        List listReasignacionesNoAplicadas = new ArrayList();
        Connection con = null;
        PreparedStatement statement1 = null;
        PreparedStatement statement2 = null;
        PreparedStatement statement3 = null;
        PreparedStatement statement4 = null;
        PreparedStatement statement5 = null;
	PreparedStatement statement6 = null;
	PreparedStatement stmtUpdateEnvioMovimiento = null;
        PreparedStatement stmtInsertEnvioMovimiento = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            con.setAutoCommit(false);
            statement1 = con.prepareStatement("SELECT CODIGO_FACTURA_ORDEN_EM, FECHA_FACTURA_EM " +
                                              "FROM " + SCHEMA + ".ORDEN_PROCESO_DETALLE " +
                                              "WHERE NUMERO_ORDEN = ? AND CODIGO_NODO = ?");
            statement2 = con.prepareStatement("INSERT INTO " + SCHEMA + ".ORDEN_PROCESO_DETALLE (NUMERO_ORDEN, CODIGO_NODO, ESTADO) " +
                                              "VALUES (?, ?, ?)");
	    
            statement6 = con.prepareStatement("UPDATE " + SCHEMA + ".ENVIO " +
                                              "SET CODIGO_NODO = ? " +
                                              "WHERE CODIGO_BARRAS = ?");
	    
	    statement3 = con.prepareStatement("UPDATE " + SCHEMA + ".ENVIO " +
				      "SET CODIGO_NODO = ?, CODIGO_ULTIMA_GESTION = ?, FECHA_ULTIMA_GESTION = ? " +
				      "WHERE CODIGO_BARRAS = ? AND CODIGO_ULTIMA_GESTION IN (2,9,11,17) ");
	   
            statement4 = con.prepareStatement("UPDATE " + SCHEMA + ".REASIGNACION_DISTRIBUCION " +
                                              "SET UID_EVALUACION = ?, FECHA_EVALUACION = ?, CODIGO_EVALUACION = ?, REASIGNACION_APLICADA = ? " +
                                              "WHERE CODIGO_REASIGNACION = ?");
            statement5 = con.prepareStatement("UPDATE " + SCHEMA + ".REASIGNACION_DISTRIBUCION " +
                                              "SET UID_EVALUACION = ?, FECHA_EVALUACION = ?, CODIGO_EVALUACION = ?, REASIGNACION_APLICADA = ?, MOTIVO_NO_APLICACION = ? " +
                                              "WHERE CODIGO_REASIGNACION = ?");
	    
	    //Cambio de Gestion a Despachos
	    stmtUpdateEnvioMovimiento = con.prepareStatement("UPDATE "+ SCHEMA +".ENVIO_MOVIMIENTO  SET FECHA_WEB=?,FECHA_CARGA_WEB=?,CODIGO_RESPONSABLE=? WHERE CODIGO_BARRAS=? AND CODIGO_GESTION=? AND FECHA_MOVIMIENTO=?");            
	    
            stmtInsertEnvioMovimiento = con.prepareStatement("INSERT INTO "+ SCHEMA +".ENVIO_MOVIMIENTO (CODIGO_BARRAS,CODIGO_GESTION,FECHA_MOVIMIENTO,FECHA_WEB,FECHA_CARGA_WEB,CODIGO_RESPONSABLE) VALUES (?,?,?,?,?,?) ");
	    
	    
            Iterator iterator1 = listReasignacionesDistribucion.iterator();
            while (iterator1.hasNext()) {
                int indice = 0;
                boolean applyUpdate = false;
                ReasignacionDistribucionDto reasignacionDistribucionDto = (ReasignacionDistribucionDto) iterator1.next();
                statement1.setObject(++indice, reasignacionDistribucionDto.getNumeroOrden());
                statement1.setObject(++indice, reasignacionDistribucionDto.getCodigoNodoInicial());
                rs = statement1.executeQuery();
                if (rs.next()) {
                    indice = 0;
                    String codigoFacturaOrdenEMInicial = rs.getString(++indice);
                    Date fechaFacturaEMInicial = rs.getDate(++indice);
                    if (codigoFacturaOrdenEMInicial == null && fechaFacturaEMInicial == null) {
                        indice = 0;
                        statement1.setObject(++indice, reasignacionDistribucionDto.getNumeroOrden());
                        statement1.setObject(++indice, reasignacionDistribucionDto.getCodigoNodoFinal());
                        rs = statement1.executeQuery();
                        if (rs.next()) {
                            indice = 0;
                            String codigoFacturaOrdenEMFinal = rs.getString(++indice);
                            Date fechaFacturaEMFinal = rs.getDate(++indice);
                            if (codigoFacturaOrdenEMFinal == null && fechaFacturaEMFinal == null) {
                                applyUpdate = true;
                            }
                            else {
                                reasignacionDistribucionDto.setMessage(DistribucionSource.getInstance().getDistribucionMessagesSetupKey("ordenProcesoFacturadaNodoFinal"));
                            }
                        }
                        else {
                            indice = 0;
                            statement2.setObject(++indice, reasignacionDistribucionDto.getNumeroOrden());
                            statement2.setObject(++indice, reasignacionDistribucionDto.getCodigoNodoFinal());
                            statement2.setObject(++indice, DistribucionSource.getInstance().getDistribucionSetupKey("ordenProcesoDetalleActiva"));
                            statement2.executeUpdate();
                            applyUpdate = true;
                        }
                    }
                    else {
                        reasignacionDistribucionDto.setMessage(DistribucionSource.getInstance().getDistribucionMessagesSetupKey("ordenProcesoFacturadaNodoInicial"));
                    }
                }
                else {
                    reasignacionDistribucionDto.setMessage(DistribucionSource.getInstance().getDistribucionMessagesSetupKey("ordenProcesoNoRelacionada"));
                }
                if (applyUpdate) {
                    Iterator iterator2 = reasignacionDistribucionDto.getListCodigosBarra().iterator();
                    while (iterator2.hasNext()) {
                       
                        DetailDto detailDto = (DetailDto) iterator2.next();
                        
			indice=0;
			
			statement6.setObject(++indice, reasignacionDistribucionDto.getCodigoNodoFinal());		
                        statement6.setObject(++indice, detailDto.getCodigoBarras());
			
			statement6.executeUpdate();
			
			indice = 0;
			statement3.setObject(++indice, reasignacionDistribucionDto.getCodigoNodoFinal());
			//Cambio de Gestion a Despachos
			statement3.setObject(++indice, ConstantesGenerales.CODIGO_GESTION_DESPACHOS);
			statement3.setObject(++indice, new java.sql.Date((new Date()).getTime()));
                        statement3.setObject(++indice, detailDto.getCodigoBarras());
				
                        int rowsUpdate_=statement3.executeUpdate();
			
			if(rowsUpdate_>0){
			    indice = 0;
			    //Cambio de Gestion a Despachos
			    stmtInsertEnvioMovimiento.setObject(++indice, detailDto.getCodigoBarras());
			    stmtInsertEnvioMovimiento.setObject(++indice, ConstantesGenerales.CODIGO_GESTION_DESPACHOS);
			    stmtInsertEnvioMovimiento.setObject(++indice, new Timestamp((new Date()).getTime()));
			    stmtInsertEnvioMovimiento.setObject(++indice, new Timestamp((new Date()).getTime()));   
			    stmtInsertEnvioMovimiento.setObject(++indice, new Timestamp((new Date()).getTime()));  
			    stmtInsertEnvioMovimiento.setObject(++indice,uidEvaluacion);  
			    try{
				stmtInsertEnvioMovimiento.executeUpdate();  
			    }catch (SQLException e) {
				//Violacion de llave primaria
				if(e.getErrorCode()==-803){	
				    indice = 0;
					stmtUpdateEnvioMovimiento.setObject(++indice, new Timestamp((new Date()).getTime()));
					stmtUpdateEnvioMovimiento.setObject(++indice, new Timestamp((new Date()).getTime()));   
					stmtUpdateEnvioMovimiento.setObject(++indice,uidEvaluacion);  
					stmtUpdateEnvioMovimiento.setObject(++indice, detailDto.getCodigoBarras());
					stmtUpdateEnvioMovimiento.setObject(++indice, ConstantesGenerales.CODIGO_GESTION_DESPACHOS);				    
					stmtUpdateEnvioMovimiento.setObject(++indice, new Timestamp((new Date()).getTime()));  
					stmtUpdateEnvioMovimiento.executeUpdate();
				}else{
				     System.out.println("ERROR CODE:"+e.getErrorCode());
				     throw new Exception("ERROR CODE:"+e.getErrorCode());
				}
			    }		
			}
		    }
                    indice = 0;
                    statement4.setObject(++indice, uidEvaluacion);
                    statement4.setObject(++indice, new Timestamp((new Date()).getTime()));
                    statement4.setObject(++indice, ConstantesGenerales.CODIGO_EVALUACION_APRUEBA);
                    statement4.setObject(++indice, ConstantesGenerales.CODIGO_REASIGNACION_APLICADA);
                    statement4.setObject(++indice, reasignacionDistribucionDto.getCodigoReasignacion());
                    statement4.executeUpdate();
                    reasignacionDistribucionDto.setMessage(DistribucionSource.getInstance().getDistribucionMessagesSetupKey("reasignacionAplicada"));
                    reasignacionDistribucionDto.setPathImagenAlarma(ConstantesGenerales.PATH_IMAGEN_ALARMA_OK);
                }
                else {
                    indice = 0;
                    statement5.setObject(++indice, uidEvaluacion);
                    statement5.setObject(++indice, new Timestamp((new Date()).getTime()));
                    statement5.setObject(++indice, ConstantesGenerales.CODIGO_EVALUACION_APRUEBA);
                    statement5.setObject(++indice, ConstantesGenerales.CODIGO_REASIGNACION_NO_APLICADA);
                    statement5.setObject(++indice, reasignacionDistribucionDto.getMessage());
                    statement5.setObject(++indice, reasignacionDistribucionDto.getCodigoReasignacion());
                    statement5.executeUpdate();
                    reasignacionDistribucionDto.setPathImagenAlarma(ConstantesGenerales.PATH_IMAGEN_ALARMA_WARNING);
                    listReasignacionesNoAplicadas.add(reasignacionDistribucionDto);
                }
                listReasignacionesDistribucionAll.add(reasignacionDistribucionDto);
            }
            con.commit();
            hashtable.put("listReasignacionesDistribucionAll", listReasignacionesDistribucionAll);
            hashtable.put("listReasignacionesNoAplicadas", listReasignacionesNoAplicadas);
        }
        catch (SQLException e) {
            try {
                con.rollback();
                throw new DAOException("ReasignacionDAO:updateEnvios: " + e.toString(), e);
            }
            catch (SQLException ex) {
                throw new DAOException("ReasignacionDAO:updateEnvios:rollback: " + ex.toString(), ex);
            }
        }
        catch (Exception e) {
            try {
                con.rollback();
                throw new DAOException("ReasignacionDAO:updateEnvios: " + e.toString(), e);
            }
            catch (SQLException ex) {
                throw new DAOException("ReasignacionDAO:updateEnvios:rollback: " + ex.toString(), ex);
            }
        }
        finally {
            closeConnection(null, statement1);
            closeConnection(null, statement2);
            closeConnection(null, statement3);
	    closeConnection(null, statement6);
            closeConnection(null, statement4);
	    closeConnection(null, stmtInsertEnvioMovimiento);
	    closeConnection(null, stmtUpdateEnvioMovimiento);
            closeConnection(con, statement5, rs);
        }
        return hashtable;
    }
    
    public void insertMensajeAlerta(String fileName, String ldapUser, int numeroRegistros) throws DAOException {
        Connection con = null;
        PreparedStatement statement = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("INSERT INTO " + SCHEMA + ".MENSAJE_ALERTA (CODIGO_TIPO_ARCHIVO, CODIGO_RESPONSABLE, DESCRIPCION_MENSAJE_ALERTA, ORIGEN_MENSAJE_ALERTA, PATH_MENSAJE_ALERTA, FECHA_REGISTRO, ESTADO) " +
                                             "VALUES (?, ?, ?, ?, ?, ?, ?)");
            int indice = 0;
            statement.setObject(++indice, ConstantesGenerales.FILE_CODE);
            statement.setObject(++indice, ldapUser);
            statement.setObject(++indice, ConstantesGenerales.DESCRIPCION_MENSAJE_ALERTA_REASIGNACION.replace("?", Integer.toString(numeroRegistros)));
            statement.setObject(++indice, ConstantesGenerales.FILE_ORIGIN_REASIGNACION);
            statement.setObject(++indice, fileName);
            statement.setTimestamp(++indice, new Timestamp((new Date()).getTime()));
            statement.setObject(++indice, ConstantesGenerales.FILE_ACTIVE);
            statement.executeUpdate();
        }
        catch (SQLException e) {
            throw new DAOException("ReasignacionDAO:insertMensajeAlerta: " + e.toString(), e);
        }
        finally {
            closeConnection(con, statement);
        }
    }
    
    public List getReasignacionesDistribucion() throws DAOException {
        List listReasignacionesDistribucion = new ArrayList();
        Connection con = null;
        PreparedStatement statement1 = null;
        PreparedStatement statement2 = null;
        ResultSet rs1 = null;
        ResultSet rs2 = null;
        try {
            con = getConnectionDB2();
            statement1 = con.prepareStatement("SELECT RD.CODIGO_REASIGNACION, RD.UID_RESPONSABLE, RD.FECHA_REASIGNACION, RD.NUMERO_ORDEN, RD.FECHA_PROCESO, RD.CODIGO_NODO_INICIAL, RD.CODIGO_NODO_FINAL, " +
                                              "RD.DESCRIPCION_MOTIVO, C.RAZON_SOCIAL, P.DESCRIPCION_PRODUCTO, PI.RAZON_SOCIAL, NDI.NOMBRE_NODO, PF.RAZON_SOCIAL, NDF.NOMBRE_NODO " +
                                              "FROM " + SCHEMA + ".REASIGNACION_DISTRIBUCION RD " +
                                              "INNER JOIN " + SCHEMA + ".CLIENTE C ON RD.CODIGO_CLIENTE = C.CODIGO_CLIENTE " +
                                              "INNER JOIN " + SCHEMA + ".PRODUCTO P ON RD.CODIGO_PRODUCTO = P.CODIGO_PRODUCTO " +
                                              "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION NDI ON RD.CODIGO_NODO_INICIAL = NDI.CODIGO_NODO " +
                                              "INNER JOIN " + SCHEMA + ".PROVEEDOR PI ON NDI.CODIGO_PROVEEDOR = PI.CODIGO_PROVEEDOR " +
                                              "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION NDF ON RD.CODIGO_NODO_FINAL = NDF.CODIGO_NODO " +
                                              "INNER JOIN " + SCHEMA + ".PROVEEDOR PF ON NDF.CODIGO_PROVEEDOR = PF.CODIGO_PROVEEDOR " +
                                              "WHERE RD.UID_EVALUACION IS NULL AND RD.FECHA_EVALUACION IS NULL AND RD.CODIGO_EVALUACION IS NULL " +
                                              "ORDER BY RD.FECHA_REASIGNACION ASC, CODIGO_REASIGNACION ASC");
            statement2 = con.prepareStatement("SELECT CODIGO_BARRAS " +
                                              "FROM " + SCHEMA + ".REASIGNACION_DISTRIBUCION_DETALLE " +
                                              "WHERE CODIGO_REASIGNACION = ?");
            rs1 = statement1.executeQuery();
            while (rs1.next()) {
                int indice1 = 0;
                List listCodigosBarra = new ArrayList();
                String codigosBarra = "";
                ReasignacionDistribucionDto reasignacionDistribucionDto = new ReasignacionDistribucionDto();
                reasignacionDistribucionDto.setCodigoReasignacion(rs1.getString(++indice1));
                reasignacionDistribucionDto.setUidResponsable(rs1.getString(++indice1));
                reasignacionDistribucionDto.setFechaReasignacion(rs1.getDate(++indice1));
                reasignacionDistribucionDto.setFechaReasignacionFormat(ConstantesGenerales.SIMPLE_DATE_FORMAT.format(reasignacionDistribucionDto.getFechaReasignacion()));
                reasignacionDistribucionDto.setNumeroOrden(rs1.getString(++indice1));
                reasignacionDistribucionDto.setFechaProceso(rs1.getDate(++indice1));
                reasignacionDistribucionDto.setFechaProcesoFormat(ConstantesGenerales.SHORT_SIMPLE_DATE_FORMAT_TO_HELP.format(reasignacionDistribucionDto.getFechaProceso()));
                reasignacionDistribucionDto.setCodigoNodoInicial(rs1.getString(++indice1));
                reasignacionDistribucionDto.setCodigoNodoFinal(rs1.getString(++indice1));
                reasignacionDistribucionDto.setDescripcionMotivo(rs1.getString(++indice1));
                reasignacionDistribucionDto.setRazonSocialCliente(rs1.getString(++indice1));
                reasignacionDistribucionDto.setDescripcionProducto(rs1.getString(++indice1));
                reasignacionDistribucionDto.setRazonSocialProveedorInicial(rs1.getString(++indice1));
                reasignacionDistribucionDto.setNombreNodoInicial(rs1.getString(++indice1));
                reasignacionDistribucionDto.setRazonSocialProveedorFinal(rs1.getString(++indice1));
                reasignacionDistribucionDto.setNombreNodoFinal(rs1.getString(++indice1));
                int indice2 = 0;
                statement2.setObject(++indice2, reasignacionDistribucionDto.getCodigoReasignacion());
                rs2 = statement2.executeQuery();
                while (rs2.next()) {
                    indice2 = 0;
                    DetailDto detailDto = new DetailDto();
                    detailDto.setCodigoBarras(rs2.getString(++indice2));
                    codigosBarra = indice2 != 0 ? codigosBarra + "\n" + detailDto.getCodigoBarras() : detailDto.getCodigoBarras();
                    listCodigosBarra.add(detailDto);
                }
                reasignacionDistribucionDto.setListCodigosBarra(listCodigosBarra);
                reasignacionDistribucionDto.setCodigosBarra(codigosBarra);
                listReasignacionesDistribucion.add(reasignacionDistribucionDto);
            }
        } 
        catch (SQLException e) {
            throw new DAOException("ReasignacionDAO:getReasignacionesDistribucion: " + e.toString(), e);
        }
        finally {
            closeConnection(null, statement1, rs1);
            closeConnection(con, statement2, rs2);
        }
        return listReasignacionesDistribucion;
    }
    
    public List denegarReasignaciones(List listReasignacionesDistribucion, String uidEvaluacion) throws DAOException {
        List listReasignacionesDistribucionReturn = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            con.setAutoCommit(false);
            statement = con.prepareStatement("UPDATE " + SCHEMA + ".REASIGNACION_DISTRIBUCION " +
                                             "SET UID_EVALUACION = ?, FECHA_EVALUACION = ?, CODIGO_EVALUACION = ? " +
                                             "WHERE CODIGO_REASIGNACION = ?");
            Iterator iterator = listReasignacionesDistribucion.iterator();
            while (iterator.hasNext()) {
                int indice = 0;
                ReasignacionDistribucionDto reasignacionDistribucionDto = (ReasignacionDistribucionDto) iterator.next();
                statement.setObject(++indice, uidEvaluacion);
                statement.setObject(++indice, new Timestamp((new Date()).getTime()));
                statement.setObject(++indice, ConstantesGenerales.CODIGO_EVALUACION_DENEGA);
                statement.setObject(++indice, reasignacionDistribucionDto.getCodigoReasignacion());
                statement.executeUpdate();
                reasignacionDistribucionDto.setMessage(DistribucionSource.getInstance().getDistribucionMessagesSetupKey("reasignacionDenegada"));
                reasignacionDistribucionDto.setPathImagenAlarma(ConstantesGenerales.PATH_IMAGEN_ALARMA_ERROR);
                listReasignacionesDistribucionReturn.add(reasignacionDistribucionDto);
            }
            con.commit();
        } 
        catch (SQLException e) {
            try {
                con.rollback();
                throw new DAOException("ReasignacionDAO:denegarReasignaciones: " + e.toString(), e);
            }
            catch (SQLException ex) {
                throw new DAOException("ReasignacionDAO:denegarReasignaciones:rollback: " + ex.toString(), ex);
            }
        }
        finally {
            closeConnection(con, statement, rs);
        }
        return listReasignacionesDistribucionReturn;
    }
}